import axios from 'axios'
// import Element from 'element-ui'
import router from './router'
import store from './store'

//定义变量 然后所有的axios请求都会加上这一段
axios.defaults.baseURL = "http://39.105.133.211:8081"

// axios.defaults.baseURL = "http://localhost:8081"
// 参考资料：https://www.jianshu.com/p/ff8541e0976a

// 前置拦截   注意在main.js中需要导入
axios.interceptors.request.use(config => {
    // 在发送请求之前做些什么
    // 判断是否存在token,如果存在将每个页面header添加token
    if (localStorage.getItem("token")) {
        config.headers.common['Authorization'] = localStorage.getItem("token");
    }
    return config
})

// 后置拦截  怎么个处理
axios.interceptors.response.use(response => {
        //拿到前端的Result
        let res = response.data;

        if (res.code === 300) {
            //表示token过期 清空token并刷新主页
            store.commit("REMOVE_INFO")  //先清空token
            location.reload()
        }

        // console.log("=================")
        // console.log(res)
        // console.log("=================")

        //httpStatue 可以在java中看
        //全局异常处理中有
        if (res.code === 200) {
            //正常
            // console.log('请求响应成功')
            return response
        } else if (res.code === 10000) {
            //自定义的错误码 如果错误是 10000
            //表示被封号了
            store.commit("REMOVE_INFO")  //先清空token
            ELEMENT.Message.error('号都凉了', {duration: 3 * 1000})
            console.log("被封号了")
        }
        else {

            console.log('请求相应失败')

            //使用ElementUI组件  友好显示
            //这里有细节  不是 this.Message.error
            if(!res) {
                ELEMENT.Message.error(res.msg, {duration: 3 * 1000})
            } else {
                ELEMENT.Message.error(response.data.msg)
            }

            // ELEMENT.Message.warning("token失效")

            //阻止进入后面逻辑this.$axios.post('/login', this.ruleForm).then(res => {
            //
            //             //这里面直接使用 this代表请求（axios对象的）
            //             console.log(res.data)
            return Promise.reject(response.data.msg)
        }
    },
    // 如果前端没有接收到result 因为 后端通过Assert已经 error  也就是处理服务器error的情况
    //例如 登录的时候 查询database中的账号 查不到的时候
    error => {
        console.log(error)
        //当data不为空  表示 该异常被后端封装了data的时候 就赋值
        if (error.response.data) {
            error.message = error.response.data.msg
        }

        //401表示没有 登录（后的权限）
        if (error.response.status === 401) {
            //需要将信息清空
            store.commit("REMOVE_INFO")

            //并转到登陆页面
            let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)
            if (flag) {
                // alert("手机端");
                console.log('手机端')
                this.$router.replace('/mlogin');
            } else {
                console.log('pc端')
                // this.$router.replace('/pc');
                this.$router.replace('/login');
            }
            router.push("/login")
        }

        //除了401的错误  都直接 友好提示
        ELEMENT.Message.error(error.message, {duration: 3 * 1000})
        return Promise.reject(error)
    }
)